from datetime import datetime, date
from typing import Optional

from pydantic import BaseModel, ConfigDict


class PythonModelVO(BaseModel):
    """
    PythonModel实体的视图对象(View Object)

    用于将PythonModel实体数据返回给前端展示，包含所有字段信息
    """
    # 主键
    id: Optional[int] = None
    # 创建时间
    create_time: Optional[datetime] = None
    # 创建人
    created_by: Optional[int] = None
    # 更新时间
    update_time: Optional[datetime] = None
    # 更新人
    updated_by: Optional[int] = None
    # 名称
    name: Optional[str] = None
    # 编码
    code: Optional[str] = None
    # 描述
    describe: Optional[str] = None
    # 生日日期
    birthday: Optional[date] = None

    model_config = ConfigDict(
        # 返回给前端的时间，格式化"年-月-日 时:分:秒"格式
        json_encoders={
            datetime: lambda dt: dt.strftime("%Y-%m-%d %H:%M:%S")
        }
    )


class PythonModelDTO(BaseModel):
    """
    PythonModel实体的数据传输对象(Data Transfer Object)

    用于接收和传输查询条件参数，字段与实体保持一致
    """
    # 主键
    id: Optional[int] = None
    # 创建时间
    create_time: Optional[datetime] = None
    # 创建人
    created_by: Optional[int] = None
    # 更新时间
    update_time: Optional[datetime] = None
    # 更新人
    updated_by: Optional[int] = None
    # 名称
    name: Optional[str] = None
    # 编码
    code: Optional[str] = None
    # 描述
    describe: Optional[str] = None
    # 生日日期
    birthday: Optional[date] = None


class PythonModelSaveDTO(BaseModel):
    """
    PythonModel实体的新增数据传输对象

    用于接收新增实体所需的数据参数，只包含必要字段
    """
    # 名称 不能为空
    name: str
    # 编码 不能为空
    code: str
    # 描述
    describe: Optional[str] = None
    # 生日日期
    birthday: Optional[date] = None


class PythonModelUpdateDTO(BaseModel):
    """
    PythonModel实体的修改数据传输对象

    用于接收修改实体所需的数据参数，包含主键ID和可修改字段
    """
    # 主键 不能为空
    id: int
    # 名称 不能为空
    name: str
    # 编码 不能为空
    code: str
    # 描述
    describe: Optional[str] = None
    # 生日日期
    birthday: Optional[date] = None


if __name__ == '__main__':
    from datetime import date
    from app.models.demo import PythonModel

    print("\nmodel转换测试\n")

    updateDTO = PythonModelUpdateDTO(id=1, name="test", code="test", describe=None, birthday=date.today())
    print("测试pydantic model 转成 json字符串：", updateDTO.model_dump_json())
    print("测试pydantic model 转成 字典：", updateDTO.model_dump())

    try:
        entity = PythonModel(**updateDTO.model_dump())
        print("测试pydantic model 转成 sqlalchemy model：", entity.__dict__)
    except Exception as e:
        print("pydantic model 转成 sqlalchemy model 失败", e)

    try:
        entity = PythonModel(id=1, name="test", code="test", describe="test", birthday=date.today(),
                             create_time=datetime.now(), created_by=1,
                             update_time=datetime.now(), updated_by=1)
        saveDTO = PythonModelSaveDTO(**entity.__dict__)
        print("测试sqlalchemy model 转成 pydantic model：", saveDTO.model_dump())
    except Exception as e:
        print("sqlalchemy model 转成 pydantic model 失败")
